// API测试脚本
// 用于验证前端与后端的对接是否正常

const axios = require('axios');

// 测试配置
const API_BASE_URL = 'http://localhost:4112';
const TEST_MODEL_ID = 1;

// 创建axios实例
const apiClient = axios.create({
  baseURL: API_BASE_URL,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
  }
});

// 测试函数
async function testApiEndpoints() {
  console.log('🚀 开始测试API端点...\n');

  try {
    // 1. 测试获取模型列表
    console.log('1. 测试获取模型列表...');
    const listResponse = await apiClient.get('/model/list', {
      params: { search: '', occ: 'bladePoint' }
    });
    console.log('✅ 模型列表API正常');
    console.log(`   返回数据数量: ${listResponse.data.data?.length || 0}\n`);

    // 2. 测试获取模型统计
    console.log('2. 测试获取模型统计...');
    const statsResponse = await apiClient.get('/model/stats');
    console.log('✅ 模型统计API正常');
    console.log(`   总模型数: ${statsResponse.data.data?.total || 0}\n`);

    // 3. 测试获取职业列表
    console.log('3. 测试获取职业列表...');
    const occupationResponse = await apiClient.get('/model/occupations');
    console.log('✅ 职业列表API正常');
    console.log(`   职业数量: ${occupationResponse.data.data?.length || 0}\n`);

    // 4. 测试生成下载token
    console.log('4. 测试生成下载token...');
    const tokenResponse = await apiClient.post(`/model/token/${TEST_MODEL_ID}`, null, {
      params: { username: 'test_user' }
    });
    console.log('✅ 生成下载tokenAPI正常');
    console.log(`   Token: ${tokenResponse.data.data?.token?.substring(0, 20)}...\n`);

    // 5. 测试下载功能（使用token）
    console.log('5. 测试下载功能...');
    const downloadToken = tokenResponse.data.data.token;
    const downloadResponse = await apiClient.post(`/model/download/${TEST_MODEL_ID}`, null, {
      params: { username: 'test_user' },
      headers: {
        'Authorization': `Bearer ${downloadToken}`
      }
    });
    console.log('✅ 下载API正常');
    console.log(`   下载状态: ${downloadResponse.data.msg}\n`);

    // 6. 测试速率限制
    console.log('6. 测试速率限制...');
    try {
      // 快速发送多个请求
      const promises = [];
      for (let i = 0; i < 15; i++) {
        promises.push(apiClient.post(`/model/token/${TEST_MODEL_ID}`, null, {
          params: { username: 'test_user' }
        }));
      }
      await Promise.all(promises);
      console.log('⚠️  速率限制可能未生效');
    } catch (error) {
      if (error.response && error.response.status === 429) {
        console.log('✅ 速率限制正常工作');
      } else {
        console.log('❌ 速率限制测试失败');
      }
    }

    console.log('🎉 所有API测试完成！');

  } catch (error) {
    console.error('❌ API测试失败:', error.message);
    if (error.response) {
      console.error('   状态码:', error.response.status);
      console.error('   错误信息:', error.response.data);
    }
  }
}

// 测试错误处理
async function testErrorHandling() {
  console.log('\n🔍 测试错误处理...\n');

  try {
    // 测试无效的模型ID
    console.log('1. 测试无效模型ID...');
    await apiClient.get('/model/999999');
    console.log('❌ 应该返回404错误');
  } catch (error) {
    if (error.response && error.response.status === 404) {
      console.log('✅ 404错误处理正常');
    } else {
      console.log('❌ 404错误处理异常');
    }
  }

  try {
    // 测试无效的token
    console.log('2. 测试无效token...');
    await apiClient.post(`/model/download/${TEST_MODEL_ID}`, null, {
      params: { username: 'test_user' },
      headers: {
        'Authorization': 'Bearer invalid_token'
      }
    });
    console.log('❌ 应该返回401错误');
  } catch (error) {
    if (error.response && error.response.status === 401) {
      console.log('✅ 401错误处理正常');
    } else {
      console.log('❌ 401错误处理异常');
    }
  }
}

// 运行测试
async function runTests() {
  console.log('='.repeat(50));
  console.log('   前端API对接测试');
  console.log('='.repeat(50));
  
  await testApiEndpoints();
  await testErrorHandling();
  
  console.log('\n' + '='.repeat(50));
  console.log('   测试完成');
  console.log('='.repeat(50));
}

// 如果直接运行此脚本
if (require.main === module) {
  runTests().catch(console.error);
}

module.exports = {
  testApiEndpoints,
  testErrorHandling,
  runTests
};
